package thread;

public class SynDemo3 {
    public static void main(String[] args) {
        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Thread t1 = new Thread(){
            @Override
            public void run() {
                f1.dosome();
            }
        };

        Thread t2 = new Thread(){
            @Override
            public void run() {
                f2.dosome();
            }
        };

        t1.start();
        t2.start();
    }

}

/**
 * 关于synchronized修饰的方法中加入static  或 不加
 * 条件       1.两线程调用两对象的用一个方法
 * 结果推测  加入static
 *            1.分开执行
 *            原因：方法变成唯一的，两个对象的方法是同一个，
 *                 又因为synchronized的作用；
 *         不加
 *            1.并发执行
 *            原因：每个调用的方法不是同一个对象同一个方法，
 *                 不触发synchronized
 */
class Foo{
//    public static synchronized void dosome(){
//public  synchronized void dosome(){
public static  void dosome(){
    synchronized (Foo.class){
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() +":正在执行dosome方法...");
            Thread.sleep(2500);
            System.out.println(t.getName() +":dosome方法执行完毕。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    }
}
